#include"comm.hpp"
Init init;//创建管道文件，程序退出自动析构
int main()
{
    //我们之前为了通信所做的工作是什么呢，让不同的进程看到同一份资源
    //1.创建公共的key值
    key_t k = ftok(PATH_NAME,PROJ_ID);
    assert(k != -1);
    Log("create key done",Debug)<<"Server key : "<<k<<endl;
    
    //2.创建共享内存 -- 建议创建一个全新的共享内存 -- 通信的发起者
    int shmid = shmget(k,SHM_SIZE,IPC_CREAT | IPC_EXCL | 0666);
    if(shmid == -1)
    {
        perror("shmget");
        exit(1);
    }
    Log("create shm done",Debug)<<" shmid : "<<shmid<<endl;
    //3.将指定的共享内存，挂接到自己的地址空间
    char *shmaddr = (char*)shmat(shmid,nullptr,0);
    Log("attach shm done",Debug)<<" shmid : "<<shmid<<endl;
    //sleep(20);

    //通信逻辑
    //将共享内存当成一个大字符串

    int fd = OpenFIFO(FIFO_NAME,READ);

    for(;;)
    {
        Wait(fd);

        printf("%s\n",shmaddr);//读取shmaddr中的内容
        if(strcmp(shmaddr,"quit") == 0) break;
        //sleep(1);
    }





    //4.将指定的共享内存，从自己的地址去关联
    int n = shmdt(shmaddr);
    assert(n != -1);
    (void)n;
    Log("detach shm done",Debug)<<" shmid : "<<shmid<<endl;

    //sleep(20);

    //5.这里就是通信的逻辑了

    //last.删除共享内存
    n = shmctl(shmid,IPC_RMID,nullptr);
    assert(n != -1);
    (void)n;
    Log("delete shm done",Debug)<<" shmid : "<<shmid<<endl;
    closeFifo(fd);
    return 0;
}